﻿using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class CentrosCusto : Form, IFormulario
    {
        #region Propriedades e Variáveis

        BLL.CentroCusto CentroCusto = new BLL.CentroCusto();

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.CentroCusto.Lista> ListaCentroCusto;

        //Objeto utilizado para armazenas os valores novos ou de alteração de um registro
        BLL.CentroCusto.Lista CentroCustoSelecionado = null;

        //Objeto utilizado para filtros
        BLL.CentroCusto.Lista CentroCustoFiltro = null;

        //Objeto para controle do Estado da interface
        Util.Estado Estado = Util.Estado.Nenhum;

        #endregion

        #region Construtor
        public static int AnoPeriod { get; set; }

        public CentrosCusto() { }
        public CentrosCusto(int anoPeriodo)
        {
            try
            {
                InitializeComponent();

                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrid();
                InicializaCombos();
                ConfiguraInterface(Util.Estado.Nenhum);
                Limpar();

                BLL.CentroCusto CentroCusto = new BLL.CentroCusto(anoPeriodo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Contrutor

        #region Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                CentroCustoFiltro = null;
                Buscar();
                ConfiguraInterface(Util.Estado.Consulta);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                AtualizaObjeto();
                Salvar();

                if (Estado == Util.Estado.Inclusao && MessageBox.Show("Deseja informar agora os produtos para rateio?", "", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    AbreInterfaceProduto();

                if (dgvCentrosCusto.DataSource == null)
                    CarregaObjetoFiltro();

                Cancelar();
                Buscar();

                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Cancelar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //private void btnIncluir_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        CentroCustoSelecionado = new BLL.CentroCusto.Lista();
        //        ConfiguraInterface(Util.Estado.Inclusao);
        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show(ex.Message);
        //    }
        //}

        //private void btnExcluir_Click(object sender, EventArgs e)
        //{
        //    try
        //    {
        //        if (MessageBox.Show("Tem certeza que deseja excluir o centro de custo?", "Atenção", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
        //        {
        //            Excluir();
        //            Cancelar();
        //            Buscar();

        //            ConfiguraInterface(Util.Estado.Nenhum);
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        MessageBox.Show(ex.Message);
        //    }
        //}

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                Limpar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dgvCentrosCusto_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                CentroCustoSelecionado = ListaCentroCusto[dgvCentrosCusto.SelectedRows[0].Index];
                AtualizaInterface();
                ConfiguraInterface(Util.Estado.Alteracao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnProdutos_Click(object sender, EventArgs e)
        {
            AbreInterfaceProduto();
        }

        #endregion Eventos

        #region Métodos Públicos

        public void CarregaObjetoFiltro()
        {
            CentroCustoFiltro = new BLL.CentroCusto.Lista();
            if (!string.IsNullOrWhiteSpace(txtNomeCentroCusto.Text)) CentroCustoFiltro.NomeCentroCusto = txtNomeCentroCusto.Text;
            if (!string.IsNullOrWhiteSpace(txtCodigoCentroCusto.Text)) CentroCustoFiltro.CodigoCentroCusto = txtCodigoCentroCusto.Text;
            if (cboClassificacaoCentroCusto.SelectedIndex > -1) CentroCustoFiltro.IdCategoriaCentroCusto = ((BLL.CategoriaCentroCusto.Itens)cboClassificacaoCentroCusto.SelectedItem).IdCategoriaCentroCusto;;
        }

        public void InicializaCombos()
        {
            BLL.CategoriaCentroCusto Categoria = new BLL.CategoriaCentroCusto();
            cboClassificacaoCentroCusto.DataSource = Categoria.GetItens();
            cboClassificacaoCentroCusto.DisplayMember = "NomeCategoriaCentroCusto";
            cboClassificacaoCentroCusto.ValueMember = "IdCategoriaCentroCusto";
            
            BLL.DriverRateioTipo Rateio = new BLL.DriverRateioTipo();
            cboDriverRateioTipo.DataSource = Rateio.GetItens();
            cboDriverRateioTipo.DisplayMember = "NomeDriverRateioTipo";
            cboDriverRateioTipo.ValueMember = "IdDriverRateioTipo";
            cboDriverRateioTipo.SelectedValue = -1;
        }
        public void InicializaGrid()
        {
            dgvCentrosCusto.AutoGenerateColumns = false;
            dgvCentrosCusto.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvCentrosCusto.Columns.Add(new DataGridViewColumn() { DataPropertyName = "CodigoCentroCusto", HeaderText = "Código", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 10 });
            dgvCentrosCusto.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeCentroCusto", HeaderText = "Nome", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 30 });
            dgvCentrosCusto.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeCategoriaCentroCusto", HeaderText = "Categoria", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 30 });
        }

        public void ValidarInterface()
        {
            if (string.IsNullOrWhiteSpace(txtCodigoCentroCusto.Text)) throw new Exception("O código é obrigatório.");
            if (string.IsNullOrWhiteSpace(txtNomeCentroCusto.Text)) throw new Exception("O nome é obrigatório.");
        }

        public void AtualizaObjeto()
        {
            CentroCustoSelecionado.CodigoCentroCusto = txtCodigoCentroCusto.Text;
            CentroCustoSelecionado.NomeCentroCusto = txtNomeCentroCusto.Text;
            CentroCustoSelecionado.IndicaTradeAllowance = chkInidicaTradeAllowance.Checked;
            if (cboClassificacaoCentroCusto.SelectedIndex > -1)
            {
                CentroCustoSelecionado.IdCategoriaCentroCusto = ((BLL.CategoriaCentroCusto.Itens)cboClassificacaoCentroCusto.SelectedItem).IdCategoriaCentroCusto;
                CentroCustoSelecionado.NomeCategoriaCentroCusto = ((BLL.CategoriaCentroCusto.Itens)cboClassificacaoCentroCusto.SelectedItem).NomeCategoriaCentroCusto;
            }
            if (cboDriverRateioTipo.SelectedIndex > -1)
                CentroCustoSelecionado.IdDriverRateioTipo = ((BLL.DriverRateioTipo.Itens)cboDriverRateioTipo.SelectedItem).IdDriverRateioTipo;
        }

        public void AtualizaInterface()
        {
            txtCodigoCentroCusto.Text = CentroCustoSelecionado.CodigoCentroCusto;
            txtNomeCentroCusto.Text = CentroCustoSelecionado.NomeCentroCusto;
            chkInidicaTradeAllowance.Checked = Convert.ToBoolean(CentroCustoSelecionado.IndicaTradeAllowance);

            if (CentroCustoSelecionado.IdCategoriaCentroCusto > 0)
                cboClassificacaoCentroCusto.SelectedValue = CentroCustoSelecionado.IdCategoriaCentroCusto;
            else
                cboClassificacaoCentroCusto.SelectedValue = -1;

            if (CentroCustoSelecionado.IdDriverRateioTipo > 0)
                cboDriverRateioTipo.SelectedValue = CentroCustoSelecionado.IdDriverRateioTipo;
            else
                cboDriverRateioTipo.SelectedValue = -1;
        }

        public void Incluir()
        {
            CentroCusto.Add(new List<BLL.CentroCusto.Lista>() { CentroCustoSelecionado });
            MessageBox.Show("Centro de custo cadastrado com sucesso.");
        }

        public void Alterar()
        {
            CentroCusto.Update(new List<BLL.CentroCusto.Lista>() { CentroCustoSelecionado });
            MessageBox.Show("Centro de custo alterado com sucesso.");
        }

        public void Excluir()
        {
            CentroCusto.Delete(new List<BLL.CentroCusto.Lista>() { CentroCustoSelecionado });
            MessageBox.Show("Centro de custo excluído com sucesso.");
        }

        public void Cancelar()
        {
            txtCodigoCentroCusto.Text = string.Empty;
            txtNomeCentroCusto.Text = string.Empty;
            cboClassificacaoCentroCusto.SelectedIndex = -1;
        }

        public void Salvar()
        {
            switch (Estado)
            {
                case Util.Estado.Nenhum:
                    break;
                case Util.Estado.Inclusao:
                    Incluir();
                    break;
                case Util.Estado.Alteracao:
                    Alterar();
                    break;
                default:
                    break;
            }
        }

        public void Limpar()
        {
            Cancelar();
            CentroCustoFiltro = null;
            dgvCentrosCusto.DataSource = null;
        }

        public void Exportar()
        {
            string FileName = string.Empty;

            SaveFileDialog sfdExportar = new SaveFileDialog();
            sfdExportar.Filter = "Arquivo Excel 2007-2010|*.xlsx|Arquivo Excel 97-2003|*.xls";
            sfdExportar.Title = "Salvar Arquivo";
            sfdExportar.FileName = "";
            if (sfdExportar.ShowDialog() == DialogResult.OK)
            {
                FileName = sfdExportar.FileNames[0];

                string[] Cabecalho = { "Código", "Nome", "Categoria" };
                List<string> ListaCampos = new List<string> { "CodigoCentroCusto", "NomeCentroCusto", "NomeCategoriaCentroCusto" };

                Exportacao.Excel<BLL.CentroCusto.Lista>.TipoExportacao = Exportacao.TipoExportacao.Exportacao;
                Exportacao.Excel<BLL.CentroCusto.Lista>.Exportar(ListaCentroCusto, ListaCampos, Cabecalho, FileName, "Centros de Custo");
            }
        }

        public void Buscar()
        {
            if (CentroCustoFiltro == null) CarregaObjetoFiltro();
            ListaCentroCusto = CentroCusto.GetLista(CentroCustoFiltro);
            dgvCentrosCusto.DataSource = ListaCentroCusto;
            dgvCentrosCusto.ClearSelection();
        }
        public void ConfiguraInterface(Util.Estado pEstado)
        {
            Estado = pEstado;

            if (pEstado == Util.Estado.Inclusao)
                dgvCentrosCusto.ClearSelection();

            //btnIncluir.Enabled = (Estado == Util.Estado.Nenhum ||
            //                     Estado == Util.Estado.Consulta) ? true : false;

            btnSalvar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnCancelar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

          //  btnExcluir.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            btnBuscar.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            if (pEstado == Util.Estado.Nenhum)
                cboDriverRateioTipo.SelectedValue = (Estado == Util.Estado.Nenhum) ? true : false;


            btnLimpar.Enabled = (dgvCentrosCusto.DataSource != null) ? true : false;

            btnExportar.Enabled = (dgvCentrosCusto.DataSource != null) ? true : false;

            btnProdutos.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            dgvCentrosCusto.Enabled = (Estado == Util.Estado.Consulta ||
                                 (Estado == Util.Estado.Nenhum && dgvCentrosCusto.DataSource != null)) ? true : false;

        }

        private void AbreInterfaceProduto()
        {
            CentroCustoProduto frmProduto = new CentroCustoProduto(CentroCustoSelecionado.IdCentroCusto);
            frmProduto.ShowDialog();
        }

        #endregion Métodos Públicos

        private void lblTitulo_Click(object sender, EventArgs e)
        {

        }
        private void cboClassificacaoCentroCusto_SelectedIndexChanged(object sender, EventArgs e)
        {
        }
    }
}